/**
 * 任务描述：
 * mysql数据库nodejs中有个Department表
 * 字段为id，name,parentId
 * 任务就是根据id查找部门信息
 * 返回信息就是
 * {id：xx
 *  name:xx
 *  parent:{如果parentId == null 则 parent没有数据
 *      id：xx
 *      name:xx
 *      }
 *  }
 *  v4
 * 数据库查询函数不会等待数据库返回数据，而是立即返回
 * 系统在数据返回后调用回调函数通知用户
 * 采用q promise方法来建立函数，可以在查询函数的回调函数中
 * 调用resolve函数即可将数据传递给用户
 * 但是我们还要查询当前部门的父部门信息
 * 这就涉及到级联操作
 * 而且还要捕获上层数据
 * 然后将数据组装返回给用户
 */
var conn = require('../util/conn');
var Q = require('q');
var debug = console.log;

/**
 * 函数逻辑如果id为字符串则转化为数字
 * 转化失败就要进入错误处理流程
 *
 */
/**
 *
 * @param id
 * @returns {*}
 */
function getDepartmentByIdQ4(id){
    var connection = conn.getConnection();
    //connection.connect();
    var deferred = Q.defer();
    if(typeof id === 'number'){
        var query = connection.query('select * from department where id = ?',[id],function(err,rows,fields){
            if(err){
                deferred.reject(err);
            }else{
                if(rows.length > 0){
                    if(rows[0].parentId === null)
                    {
                        deferred.resolve([{id:rows[0].id,text:rows[0].name}])
                    }
                    else{
                        deferred.resolve([{id:rows[0].id,text:rows[0].name},getDepartmentByIdQ4(rows[0].parentId)]);
                    }
                }else{
                    deferred.resolve([{}]);
                }
            }
        });
        console.log(query.sql);
    }else{
        deferred.resolve({});
    }
    connection.end();
    return deferred.promise;
}
//getDepartmentByIdQ4(4).then(function(data){
//    if(data.length){
//        return data[1];
//    }else{
//        return data;
//    }
//}).then(function(data){
//    console.log(data);
//});


//getDepartmentByIdQ4(4).then(function(data){
//    if(data.length > 1){//data = [{id:xx,name:xx},promise]
//        return data[1].then(function(row){
//            data[0].parent = row[0];//if row = [{},{}]
//            debug('row:'+row);
//            return data[0];
//        });
//    }else if(data.length == 1){//data = [{id:xx,name:xx}]
//        data[0].parent = {};
//        return data[0];
//    }else{//data = [{}]
//        return data[0];
//    }
//}).then(function(data){
//    debug('data:'+data);
//    console.log(data);
//});
/**
 *
 * @param id
 * @param callback
 */
function getDepartment(id,callback){
    getDepartmentByIdQ4(id).then(function(data){
        if(data.length > 1){
            return data[1].then(function(row){
                data[0].parent = row[0];//if row = [{},{}]
                //debug('row:'+row);
                return data[0];
            });
        }else{
            data[0].parent = {};
            return data[0];
        }
    }).then(function(data){
        //debug('data:'+data);
        callback(data);
    });
}

getDepartment(1,debug);



/***************************以下是getDepartments******************************/
/**
 * getDepartmentsQ v1
 * @param parentId
 * @param callback
 */

function getDepartmentsQ1(parentId){
    var connection = conn.getConnection();
    connection.connect();
    var deferred = Q.defer();
    if(typeof parentId === 'string'){
        parentId = parseInt(parentId);
    }else if(typeof parentId !== 'number'){
        deferred.reject(new Error('parentId must be a number'));
    }else{
        var query = connection.query('select * from department where parentId = ?',[parentId],function(err,rows,fields){
            if(err){
                deferred.reject(err);
            }else{
                if(rows.length > 0){
                    deferred.resolve(rows);
                }else{
                    deferred.resolve(undefined);
                }
                console.log(rows);
            }
            //callback(rows[0]);
        });
        console.log(query.sql);
    }
    connection.end();
    return deferred.promise;
}
//getDepartmentsQ1(2).then(function(data){
//    console.log(data);
//});

